package com.beans.beans_life;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class APP {
    public static void main(String[] args) {
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
        BeanLifeComponent beanLifeComponent = context.getBean("beanLife",BeanLifeComponent.class);
        beanLifeComponent.fun();//这里我们只调用普通方法

        beanLifeComponent.preDestroy();// 销货bean

//        打印结果:
//先执行: aware 通知
//执⾏ PostConstruct() 初始化
//执⾏ init-method 前置方法
//hello fun
//执⾏：preDestroy()
    }



//1.实例化 Bean（为 Bean 分配内存空间）
//2.设置属性（Bean 注⼊和装配）
//3.Bean 初始化
//      1、执行各种通知（各种Aware）
//      比如：
//      Spring在初始化 bean，是需要给 bean 赋予 id（name）。
//      而设置 beanName 成功的话，就会生成一个 beadNameAware 通知。
//      2、执行初始化的前置方法
//      前提：我们重新 前置方法，不然它按照源码来操作。
//      3、执行构造方法，两种执行方式。
//          3.1、执行具有 @PostConstruct 注解的方法。【PostConstruct -> 初始化方法】
//          3.2、执行 init-method 方法，是 Spring 中 配置文件里面 的 bean 标签所有具有的属性。
//          这个 两个执行方法，是两个不同时期的产物。
//          @PostConstruct，是一种通过 注解 来初始化的方法。
//          init-method，是 xml 时代 的 初始化方法。
//          但是！它们描述的都是同一件事情 “ 初始化 ”。
//          它们两个执行的优先级
//          先执行 @PostConstruct 注解的方法，然后执行 init-method 方法。
//          4、执行初始化的后置方法
//
//4.使⽤ Bean
//5.销毁 Bean
}

